using DiLu.Expansion.DataStorage.Common.ColumnDataConverts;
using DiLu.Expansion.DataStorage.Common.Columns;
using SqlSugar;

namespace DiLu.Expansion.DataStorage.Common.BaseModels;

/// <summary>
///     表示一个基于Ulid标识的模型基类，用于数据存储和操作。
///     该类实现了多个接口，提供创建者、修改者、删除状态以及时间戳相关功能。
/// </summary>
/// <typeparam name="TDelete">定义删除状态的数据类型，用于表示记录是否被标记为删除。</typeparam>
/// <typeparam name="TModel">定义当前模型的类型，用于支持链式调用。</typeparam>
public class UlidModel<TDelete, TModel> : IHasCreatorId<Ulid>, IHasCreationTime,
    IHasLastModifierId<Ulid>, IHasLastModificationTime,
    IHasIsDelete<TDelete>
{
    /// <summary>
    ///     获取或设置实体的创建时间。此属性用于记录数据条目最初被创建的时间，在插入新记录时设定，且在更新操作中保持不变。
    /// </summary>
    /// <remarks>此字段在数据插入时由系统自动填充，通常对应于记录插入数据库时的时间戳。</remarks>
    [SplitField]
    [SugarColumn(ColumnDescription = "创建时间", IsOnlyIgnoreUpdate = true)]
    public DateTime CreationTime { get; set; } = DateTime.Now;

    /// <summary>
    ///     获取或设置实体的创建者ID。此属性用于标识数据条目最初由哪个用户或系统创建。
    ///     在插入新记录时设定，且在更新操作中保持不变。
    /// </summary>
    /// <remarks>此字段在数据插入时由系统自动填充，通常对应于执行插入操作的用户或系统的唯一标识符。</remarks>
    [SugarColumn(ColumnDescription = "创建者ID", Length = 26, IsOnlyIgnoreUpdate = true,
        SqlParameterDbType = typeof(UlidConvert))]
    public Ulid CreatorId { get; set; }

    /// <summary>
    ///     获取或设置记录的删除状态。此属性用于标记数据记录是否已被逻辑删除，通常配合软删除机制使用。
    /// </summary>
    /// <remarks>
    ///     该字段的值类型由泛型参数 TDelete 定义，可以是布尔值、整数或其他适合表示删除状态的数据类型。
    ///     在查询数据时，通常会根据此字段过滤掉已被标记为删除的记录。
    /// </remarks>
    [SugarColumn(ColumnDescription = "是否删除")]
    public TDelete IsDelete { get; set; }

    /// <summary>
    ///     获取或设置实体的最后修改时间。此属性用于记录该数据条目最近一次被修改的时间戳，通常在更新操作时自动更新。
    /// </summary>
    /// <remarks>此字段在数据更新时由系统自动填充，用于追踪数据的最后修改时刻。</remarks>
    [SugarColumn(ColumnDescription = "最后修改时间")]
    public DateTime LastModificationTime { get; set; } = DateTime.Now;

    /// <summary>
    ///     获取或设置最后修改者的ID。此属性用于记录对数据条目进行最后一次修改的用户标识，通常在更新记录时设定。
    /// </summary>
    /// <remarks>该字段在数据更新时由系统自动填充，用于追踪记录的修改者，确保数据变更的可追溯性。</remarks>
    [SugarColumn(ColumnDescription = "最后修改者ID", Length = 26, SqlParameterDbType = typeof(UlidConvert))]
    public Ulid LastModifierId { get; set; }

    /// <summary>
    ///     设置创建者ID，并返回当前模型实例以支持链式调用。
    /// </summary>
    /// <param name="id">表示创建者的唯一标识符，数据类型由泛型参数TAccountId定义。</param>
    /// <returns>返回当前模型实例，类型为TModel，以便支持链式调用。</returns>
    public TModel SetCreatorId(Ulid id)
    {
        CreatorId = id;
        return (TModel)(object)this;
    }

    /// <summary>
    ///     设置最后修改者ID，并返回当前模型实例以支持链式调用。
    /// </summary>
    /// <param name="id">表示最后修改者的唯一标识符，数据类型由泛型参数TAccountId定义。</param>
    /// <returns>返回当前模型实例，类型为TModel，以便支持链式调用。</returns>
    public TModel SetLastModifierId(Ulid id)
    {
        LastModifierId = id;
        return (TModel)(object)this;
    }

    /// <summary>
    ///     设置删除状态，并返回当前模型实例以支持链式调用。
    /// </summary>
    /// <param name="delete">表示删除状态的值，数据类型由泛型参数TDelete定义。</param>
    /// <returns>返回当前模型实例，类型为TModel，以便支持链式调用。</returns>
    public TModel SetDelete(TDelete delete)
    {
        IsDelete = delete;
        return (TModel)(object)this;
    }
}